<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<link rel="STYLESHEET" href="lib.css" type='text/css' />
<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
<link rel='start' href='../index.html' title='Python documentation Index' />
<link rel="first" href="lib.html" title='Python library Reference' />
<link rel='contents' href='contents.html' title="Contents" />
<link rel='index' href='genindex.html' title='Index' />
<link rel='last' href='about.html' title='About this document...' />
<link rel='help' href='about.html' title='About this document...' />
<link rel="next" href="module-stat.html" />
<link rel="prev" href="module-os.path.html" />
<link rel="parent" href="filesys.html" />
<link rel="next" href="module-stat.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='aesop' content='information' />
<title>11.2 fileinput -- 从多个输入流中遍历行</title>
</head>
<body>
<div class="navigation">
<div id='top-navigation-panel' xml:id='top-navigation-panel'>
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="11.1 os.path  "
  href="module-os.path.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="11. file and Directory"
  href="filesys.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="11.3 stat  "
  href="module-stat.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python库参考</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">前一节:</b>
<a class="sectref" rel="prev" href="module-os.path.html">11.1 os.path  </a>
<b class="navlabel">上一级:</b>
<a class="sectref" rel="parent" href="filesys.html">11. 文件和目录</a>
<b class="navlabel">下一节:</b>
<a class="sectref" rel="next" href="module-stat.html">11.3 stat  </a>
</div>
<hr /></div>
</div>
<!--End of Navigation Panel-->

<h1><a name="SECTION0013200000000000000000">
11.2 <tt class="module">fileinput</tt> --
         从多个输入流中遍历行</a>
</h1>
<a name="module-fileinput"></a>

<p>

<p>
  这个模块实现快速地写入一个循环标准输入流或一个文件列表的帮助类和函数。
<p>
  典型的用法是：

<p>
<div class="verbatim"><pre>
import fileinput
for line in fileinput.input():
    process(line)
</pre></div>

<p>
  遍历
<code>sys.argv[1:]</code>中列出的所有文件的行，如果列表为空默认为 <code>sys.stdin</code> 。如果一个文件名为 <code>'-'</code>，它也被
<code>sys.stdin</code> 替换。指定一个可供选择的文件名列表，并作为第一个参数传递给 <tt class="function">input()</tt>。也允许一个单一的文件名。
<p>
缺省所有的文件被用文本模式打开，但是在调用 <tt class="function">input()</tt> 或 <tt class="class">FileInput()</tt>时你可以通过指定 <var>mode</var> 参数重载它。如果一个 I/O 错误发生在打开或读取一个文件期间，挂起<tt class="exception">IOError</tt>。
<p>
如果 <code>sys.stdin</code> 被多次使用，再次和进一步的使用将不返回行，除了可能的交互使用，或如果它已经被明确地重置(例如，使用<code>sys.stdin.seek(0)</code>)。
<p>
空文件被打开并且立即地被关闭；它们唯一一次出现在文件名列表中完全是显而易见的当最后打开的文件为空时。
<p>
一个文件的最后一行不以一个换行字符结束是可能的；当这种情况存在时返回的行包括尾随的换行符。
<p>
你可以提供一个打开钩子通过
<var>openhook</var> 参数给 <tt class="function">input()</tt> 或 <tt class="class">FileInput()</tt>控制如何打开文件。这个钩子必须是一个函数，接受两个参数，<var>filename</var>
和 <var>mode</var>，并且返回一个对应地类文件对象。这个模块已经提供了两个有用的钩子。
<p>
  下面函数是这个模块的主要接口：<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2204' xml:id='l2h-2204' class="function">input</tt></b>(</nobr></td>
  <td><var></var><big>[</big><var>files</var><big>[</big><var>, inplace</var><big>[</big><var>,
                        backup</var><big>[</big><var>, mode</var><big>[</big><var>, openhook</var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
  创建 <tt class="class">FileInput</tt> 类实例。该实例被用作这个模块的函数的全局状态，并且在迭代期间也被返回使用。这个函数的参数将被传递给 <tt class="class">FileInput</tt> 类的构造函数。
  <p>

<span class="versionnote">2.5版本中的改变：增加了<var>mode</var> 和 <var>openhook</var> 参数。</span>
</dl>

<p>
下列函数使用 <tt class="function">input()</tt> 创建的全局状态；如果无活动状态，挂起 <tt class="exception">RuntimeError</tt>。 
<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2205' xml:id='l2h-2205' class="function">filename</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  返回当前被读取的文件名。在第一行已经被读取之前，返回 <code>None</code>。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2206' xml:id='l2h-2206' class="function">fileno</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  为当前文件返回整数``文件描述符''。当没文件被打开时(在第一行之前和文件之间)，返回 <code>-1</code>。<span class="versionnote">2.5版本中的新特性。</span>
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2207' xml:id='l2h-2207' class="function">lineno</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  返回正被读取的行号。在第一行已经被读取之前，返回 <code>0</code>。在已经被读取的最后文件的最后一行，返回该行的行号。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2208' xml:id='l2h-2208' class="function">filelineno</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  返回当前文件中的行号。在第一行已经被读取前，返回 <code>0</code>。在已经被读取的最后文件的最后一行，返回该文件中的行号。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2209' xml:id='l2h-2209' class="function">isfirstline</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  如果正读取的行是它的文件的第一行返回 true ，否则返回 false。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2210' xml:id='l2h-2210' class="function">isstdin</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  如果被读取的最后一行来自于 <code>sys.stdin</code> 返回 true，否则返回 false。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2211' xml:id='l2h-2211' class="function">nextfile</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  关闭当前文件以便于下一个迭代读取下一个文件的第一行(若有的话)；不从文件中读取的行将不记入累计的行数。该文件名不改变直到在已读取的下一个文件的第一行后。在第一行读取前，这个函数没有效果；它不能被用来跳过第一个文件。在最后读取的文件的最后一行，这个函数没有效果。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2212' xml:id='l2h-2212' class="function">close</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  关闭序列。
</dl>

<p>
该类同样实现通过子类可用的模块提供的序列行为：
<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><span class="typelabel">class</span>&nbsp;<tt id='l2h-2213' xml:id='l2h-2213' class="class">FileInput</tt></b>(</nobr></td>
  <td><var></var><big>[</big><var>files</var><big>[</big><var>,
                             inplace</var><big>[</big><var>, backup</var><big>[</big><var>,
                             mode</var><big>[</big><var>, openhook</var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
  类 <tt class="class">FileInput</tt> 是实现工具；它的方法
  <tt class="method">filename()</tt>，<tt class="method">fileno()</tt>，<tt class="method">lineno()</tt>，<tt class="method">fileline()</tt>，<tt class="method">isfirstline()</tt>，<tt class="method">isstdin()</tt>，<tt class="method">nextfile()</tt> 和 <tt class="method">close()</tt> 对应模块中的同名函数。除了它有一个 <tt class="method">readline()</tt> 方法返回下一个输入行，和一个 <tt class="method">__getitem__()</tt> 方法实现序列行为。该序列必须用严格的连续的顺序访问；随机访问和
  <tt class="method">readline()</tt> 不能被混合。
  <p>
使用 <var>mode</var> 你可以指定哪一种文件模式被传递给
  <tt class="function">open()</tt>。它必须是 <code>'r'</code>，<code>'rU'</code>，<code>'U'</code> 和 <code>'rb'</code>中的一个。  
  <p>
当给出 <var>openhook</var> 时，必须是一个函数，有两个参数，<var>filename</var> 和 <var>mode</var>, 并且返回一个相应地打开的类文件对象。你不可以同时使用 <var>inplace</var> 和 <var>openhook</var>。
  <p>

<span class="versionnote">2.5版本中的改变：增加了 <var>mode</var> 和 <var>openhook</var> 参数。</span>
</dl>

<p>
<strong>可选的原状过滤：如果关键字参数</strong> <code><var>inplace</var>=1</code> 被传递给 <tt class="function">input()</tt> 或
<tt class="class">FileInput</tt> 构造函数，该文件被移动给备份文件并且标准输出直接给输入文件(if a file of the same
name as the backup file already exists, it will be replaced silently)。This makes it possible to write a filter that rewrites its input file
in place.  If the keyword argument <code><var>backup</var>='.&lt;some
extension&gt;'</code> is also given, it specifies the extension for the backup
file, and the backup file remains around; by default, the extension is
<code>'.bak'</code> and it is deleted when the output file is closed.  In-place
filtering is disabled when standard input is read.
<p>
<strong>Caveat:</strong> The current implementation does not work for MS-DOS
8+3 filesystems.

<p>
The two following opening hooks are provided by this module:

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2214' xml:id='l2h-2214' class="function">hook_compressed</tt></b>(</nobr></td>
  <td><var>filename, mode</var>)</td></tr></table></dt>
<dd>
  Transparently opens files compressed with gzip and bzip2 (recognized
  by the extensions <code>'.gz'</code> and <code>'.bz2'</code>) using the <tt class="module">gzip</tt>
  and <tt class="module">bz2</tt> modules.  If the filename extension is not <code>'.gz'</code>
  or <code>'.bz2'</code>, the file is opened normally (ie,
  using <tt class="function">open()</tt> without any decompression).

<p>
Usage example: 
  "<tt class="samp">fi = fileinput.FileInput(openhook=fileinput.hook_compressed)</tt>"
<p>

<span class="versionnote">New in version 2.5.</span>

</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-2215' xml:id='l2h-2215' class="function">hook_encoded</tt></b>(</nobr></td>
  <td><var>encoding</var>)</td></tr></table></dt>
<dd>
  Returns a hook which opens each file with <tt class="function">codecs.open()</tt>,
  using the given <var>encoding</var> to read the file.

<p>
Usage example:
  "<tt class="samp">fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))</tt>"
<p>
<span class="note"><b class="label">Note:</b>
With this hook, <tt class="class">FileInput</tt> might return Unicode strings
        depending on the specified <var>encoding</var>.</span>
  
<span class="versionnote">New in version 2.5.</span>

</dl>

<div class="navigation">
<div class='online-navigation'>
<p></p><hr />
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="11.1 os.path  "
  href="module-os.path.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="11. file and Directory"
  href="filesys.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="11.3 stat  "
  href="module-stat.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python库参考</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
  <b class="navlabel">前一节:</b> <a class="sectref" rel="prev" href="module-os.path.html">11.1 os.path </a> <b class="navlabel">上一级:</b> <a class="sectref" rel="parent" href="filesys.html">11. 文件和目录</a> <b class="navlabel">下一节:</b> <a class="sectref" rel="next" href="module-stat.html">11.3 stat</a></div>
</div>
<hr />
<span class="release-info">2.5.1 版， 文档更新在 2007，4，18。翻译：<a href="http://www.zkfarmer.org">zkfarmer</a>。</span></div>
<!--End of Navigation Panel-->
<address>
关于建议修改的信息查阅 <i><a href="about.html">关于这个文档...</a></i>。
</address>
</body>
</html>
